Merge branch 'master' of gitorious.org:yacy/rc1

pull/1/head
admin 14 years ago
commit 391fc9bd57

@ -125,7 +125,7 @@ update.cycle = 168
# It is recommended to set this list to low developer version numbers # It is recommended to set this list to low developer version numbers
update.blacklist = ...[123] update.blacklist = ...[123]
# a update can also restricted with a concept property, which can decide if an # a update can also restricted with a concept property, which can decide if an
# update is only valid if it either is a main release or any svn release including new development releases # update is only valid if it either is a main release or any release including new development releases
# Valid keywords are 'main' and 'any' # Valid keywords are 'main' and 'any'
update.concept = any update.concept = any
# the following values are set automatically: # the following values are set automatically:

@ -127,7 +127,7 @@ public class ConfigUpdate_p {
sb.getLog().logInfo("AUTO-UPDATE: downloading more recent release " + updateVersion.getUrl()); sb.getLog().logInfo("AUTO-UPDATE: downloading more recent release " + updateVersion.getUrl());
final File downloaded = updateVersion.downloadRelease(); final File downloaded = updateVersion.downloadRelease();
prop.putHTML("candeploy_autoUpdate_downloadedRelease", updateVersion.getName()); prop.putHTML("candeploy_autoUpdate_downloadedRelease", updateVersion.getName());
final boolean devenvironment = new File(sb.getAppPath(), ".svn").exists(); final boolean devenvironment = new File(sb.getAppPath(), ".git").exists();
if (devenvironment) { if (devenvironment) {
sb.getLog().logInfo("AUTO-UPDATE: omitting update because this is a development environment"); sb.getLog().logInfo("AUTO-UPDATE: omitting update because this is a development environment");
prop.put("candeploy_autoUpdate", "3"); prop.put("candeploy_autoUpdate", "3");
@ -156,7 +156,7 @@ public class ConfigUpdate_p {
// version information // version information
final String versionstring = yacyBuildProperties.getVersion() + "/" + yacyBuildProperties.getSVNRevision(); final String versionstring = yacyBuildProperties.getVersion() + "/" + yacyBuildProperties.getSVNRevision();
prop.putHTML("candeploy_versionpp", versionstring); prop.putHTML("candeploy_versionpp", versionstring);
final boolean devenvironment = new File(sb.getAppPath(), ".svn").exists(); final boolean devenvironment = new File(sb.getAppPath(), ".git").exists();
float thisVersion = Float.parseFloat(yacyBuildProperties.getVersion()); float thisVersion = Float.parseFloat(yacyBuildProperties.getVersion());
// cut off the SVN Rev in the Version // cut off the SVN Rev in the Version
try { try {

@ -73,7 +73,7 @@ public class Steering {
if (post.containsKey("update")) { if (post.containsKey("update")) {
Log.logInfo("STEERING", "update request from " + requestIP); Log.logInfo("STEERING", "update request from " + requestIP);
final boolean devenvironment = new File(sb.getAppPath(), ".svn").exists(); final boolean devenvironment = new File(sb.getAppPath(), ".git").exists();
final String releaseFileName = post.get("releaseinstall", ""); final String releaseFileName = post.get("releaseinstall", "");
final File releaseFile = new File(sb.getDataPath(), "DATA/RELEASE/".replace("/", File.separator) + releaseFileName); final File releaseFile = new File(sb.getDataPath(), "DATA/RELEASE/".replace("/", File.separator) + releaseFileName);
if ((!devenvironment) && (releaseFileName.length() > 0) && (releaseFile.exists())) { if ((!devenvironment) && (releaseFileName.length() > 0) && (releaseFile.exists())) {

@ -26,8 +26,10 @@
package net.yacy.kelondro.data.word; package net.yacy.kelondro.data.word;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap; import java.util.TreeMap;
import net.yacy.cora.document.ASCII; import net.yacy.cora.document.ASCII;
@ -39,15 +41,18 @@ import net.yacy.kelondro.util.ByteBuffer;
public class WordReferenceFactory implements ReferenceFactory<WordReference> { public class WordReferenceFactory implements ReferenceFactory<WordReference> {
@Override
public WordReference produceSlow(final Entry e) { public WordReference produceSlow(final Entry e) {
return new WordReferenceRow(e); return new WordReferenceRow(e);
} }
@Override
public WordReference produceFast(final WordReference r) { public WordReference produceFast(final WordReference r) {
if (r instanceof WordReferenceVars) return r; if (r instanceof WordReferenceVars) return r;
return new WordReferenceVars(r); return new WordReferenceVars(r);
} }
@Override
public Row getRow() { public Row getRow() {
return WordReferenceRow.urlEntryRow; return WordReferenceRow.urlEntryRow;
} }
@ -110,8 +115,8 @@ public class WordReferenceFactory implements ReferenceFactory<WordReference> {
* @param peerhash * @param peerhash
* @return * @return
*/ */
public static final TreeMap<String, StringBuilder> decompressIndex(ByteBuffer ci, final String peerhash) { public static final SortedMap<String, StringBuilder> decompressIndex(ByteBuffer ci, final String peerhash) {
TreeMap<String, StringBuilder> target = new TreeMap<String, StringBuilder>(); SortedMap<String, StringBuilder> target = Collections.synchronizedSortedMap(new TreeMap<String, StringBuilder>());
// target is a mapping from url-hashes to a string of peer-hashes // target is a mapping from url-hashes to a string of peer-hashes
if (ci.byteAt(0) != '{' || ci.byteAt(ci.length() - 1) != '}') return target; if (ci.byteAt(0) != '{' || ci.byteAt(ci.length() - 1) != '}') return target;
//System.out.println("DEBUG-DECOMPRESS: input is " + ci.toString()); //System.out.println("DEBUG-DECOMPRESS: input is " + ci.toString());

@ -106,12 +106,14 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
init(); init();
} }
@Override
public long mem() { public long mem() {
long m = 0; long m = 0;
for (final Index i: this.tables.values()) m += i.mem(); for (final Index i: this.tables.values()) m += i.mem();
return m; return m;
} }
@Override
public final byte[] smallestKey() { public final byte[] smallestKey() {
final HandleSet keysort = new HandleSet(this.rowdef.primaryKeyLength, this.rowdef.objectOrder, this.tables.size()); final HandleSet keysort = new HandleSet(this.rowdef.primaryKeyLength, this.rowdef.objectOrder, this.tables.size());
for (final Index oi: this.tables.values()) try { for (final Index oi: this.tables.values()) try {
@ -122,6 +124,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
return keysort.smallestKey(); return keysort.smallestKey();
} }
@Override
public final byte[] largestKey() { public final byte[] largestKey() {
final HandleSet keysort = new HandleSet(this.rowdef.primaryKeyLength, this.rowdef.objectOrder, this.tables.size()); final HandleSet keysort = new HandleSet(this.rowdef.primaryKeyLength, this.rowdef.objectOrder, this.tables.size());
for (final Index oi: this.tables.values()) try { for (final Index oi: this.tables.values()) try {
@ -222,6 +225,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
} }
final Table a = table; final Table a = table;
final Thread p = new Thread() { final Thread p = new Thread() {
@Override
public void run() { public void run() {
a.warmUp(); a.warmUp();
} }
@ -245,6 +249,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
*/ */
} }
@Override
public void clear() throws IOException { public void clear() throws IOException {
close(); close();
final String[] l = this.path.list(); final String[] l = this.path.list();
@ -273,10 +278,12 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
FileUtils.deletedelete(tabledir); FileUtils.deletedelete(tabledir);
} }
@Override
public String filename() { public String filename() {
return new File(this.path, this.prefix).toString(); return new File(this.path, this.prefix).toString();
} }
@Override
public int size() { public int size() {
final Iterator<Index> i = this.tables.values().iterator(); final Iterator<Index> i = this.tables.values().iterator();
int s = 0; int s = 0;
@ -284,6 +291,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
return s; return s;
} }
@Override
public boolean isEmpty() { public boolean isEmpty() {
final Iterator<Index> i = this.tables.values().iterator(); final Iterator<Index> i = this.tables.values().iterator();
while (i.hasNext()) if (!i.next().isEmpty()) return false; while (i.hasNext()) if (!i.next().isEmpty()) return false;
@ -298,20 +306,24 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
return s; return s;
} }
@Override
public Row row() { public Row row() {
return this.rowdef; return this.rowdef;
} }
@Override
public boolean has(final byte[] key) { public boolean has(final byte[] key) {
return keeperOf(key) != null; return keeperOf(key) != null;
} }
@Override
public Row.Entry get(final byte[] key, final boolean forcecopy) throws IOException { public Row.Entry get(final byte[] key, final boolean forcecopy) throws IOException {
final Index keeper = keeperOf(key); final Index keeper = keeperOf(key);
if (keeper == null) return null; if (keeper == null) return null;
return keeper.get(key, forcecopy); return keeper.get(key, forcecopy);
} }
@Override
public Map<byte[], Row.Entry> get(final Collection<byte[]> keys, final boolean forcecopy) throws IOException, InterruptedException { public Map<byte[], Row.Entry> get(final Collection<byte[]> keys, final boolean forcecopy) throws IOException, InterruptedException {
final Map<byte[], Row.Entry> map = new TreeMap<byte[], Row.Entry>(row().objectOrder); final Map<byte[], Row.Entry> map = new TreeMap<byte[], Row.Entry>(row().objectOrder);
Row.Entry entry; Row.Entry entry;
@ -344,6 +356,8 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
// check size and age of given table; in case it is too large or too old // check size and age of given table; in case it is too large or too old
// create a new table // create a new table
assert table != null; assert table != null;
long t = System.currentTimeMillis();
if (((t / 1000) % 10) != 0) return table; // we check only every 10 seconds because all these file and parser operations are very expensive
final String name = new File(table.filename()).getName(); final String name = new File(table.filename()).getName();
long d; long d;
try { try {
@ -352,12 +366,13 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
Log.logSevere("SplitTable", "", e); Log.logSevere("SplitTable", "", e);
d = 0; d = 0;
} }
if (d + this.fileAgeLimit < System.currentTimeMillis() || new File(this.path, name).length() >= this.fileSizeLimit) { if (d + this.fileAgeLimit < t || new File(this.path, name).length() >= this.fileSizeLimit) {
return newTable(); return newTable();
} }
return table; return table;
} }
@Override
public Row.Entry replace(final Row.Entry row) throws IOException, RowSpaceExceededException { public Row.Entry replace(final Row.Entry row) throws IOException, RowSpaceExceededException {
assert row.objectsize() <= this.rowdef.objectsize; assert row.objectsize() <= this.rowdef.objectsize;
Index keeper = keeperOf(row.getPrimaryKeyBytes()); Index keeper = keeperOf(row.getPrimaryKeyBytes());
@ -377,6 +392,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
* @throws IOException * @throws IOException
* @throws RowSpaceExceededException * @throws RowSpaceExceededException
*/ */
@Override
public boolean put(final Row.Entry row) throws IOException, RowSpaceExceededException { public boolean put(final Row.Entry row) throws IOException, RowSpaceExceededException {
assert row.objectsize() <= this.rowdef.objectsize; assert row.objectsize() <= this.rowdef.objectsize;
final byte[] key = row.getPrimaryKeyBytes(); final byte[] key = row.getPrimaryKeyBytes();
@ -406,6 +422,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
return null; return null;
} }
@Override
public void addUnique(final Row.Entry row) throws IOException, RowSpaceExceededException { public void addUnique(final Row.Entry row) throws IOException, RowSpaceExceededException {
assert row.objectsize() <= this.rowdef.objectsize; assert row.objectsize() <= this.rowdef.objectsize;
Index table = (this.current == null) ? null : this.tables.get(this.current); Index table = (this.current == null) ? null : this.tables.get(this.current);
@ -416,6 +433,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
table.addUnique(row); table.addUnique(row);
} }
@Override
public List<RowCollection> removeDoubles() throws IOException, RowSpaceExceededException { public List<RowCollection> removeDoubles() throws IOException, RowSpaceExceededException {
final Iterator<Index> i = this.tables.values().iterator(); final Iterator<Index> i = this.tables.values().iterator();
final List<RowCollection> report = new ArrayList<RowCollection>(); final List<RowCollection> report = new ArrayList<RowCollection>();
@ -425,18 +443,21 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
return report; return report;
} }
@Override
public boolean delete(final byte[] key) throws IOException { public boolean delete(final byte[] key) throws IOException {
final Index table = keeperOf(key); final Index table = keeperOf(key);
if (table == null) return false; if (table == null) return false;
return table.delete(key); return table.delete(key);
} }
@Override
public Row.Entry remove(final byte[] key) throws IOException { public Row.Entry remove(final byte[] key) throws IOException {
final Index table = keeperOf(key); final Index table = keeperOf(key);
if (table == null) return null; if (table == null) return null;
return table.remove(key); return table.remove(key);
} }
@Override
public Row.Entry removeOne() throws IOException { public Row.Entry removeOne() throws IOException {
final Iterator<Index> i = this.tables.values().iterator(); final Iterator<Index> i = this.tables.values().iterator();
Index table, maxtable = null; Index table, maxtable = null;
@ -454,6 +475,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
return maxtable.removeOne(); return maxtable.removeOne();
} }
@Override
public List<Row.Entry> top(final int count) throws IOException { public List<Row.Entry> top(final int count) throws IOException {
final Iterator<Index> i = this.tables.values().iterator(); final Iterator<Index> i = this.tables.values().iterator();
Index table, maxtable = null; Index table, maxtable = null;
@ -471,6 +493,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
return maxtable.top(count); return maxtable.top(count);
} }
@Override
public CloneableIterator<byte[]> keys(final boolean up, final byte[] firstKey) throws IOException { public CloneableIterator<byte[]> keys(final boolean up, final byte[] firstKey) throws IOException {
final List<CloneableIterator<byte[]>> c = new ArrayList<CloneableIterator<byte[]>>(this.tables.size()); final List<CloneableIterator<byte[]>> c = new ArrayList<CloneableIterator<byte[]>>(this.tables.size());
final Iterator<Index> i = this.tables.values().iterator(); final Iterator<Index> i = this.tables.values().iterator();
@ -482,6 +505,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
return MergeIterator.cascade(c, this.rowdef.objectOrder, MergeIterator.simpleMerge, up); return MergeIterator.cascade(c, this.rowdef.objectOrder, MergeIterator.simpleMerge, up);
} }
@Override
public CloneableIterator<Row.Entry> rows(final boolean up, final byte[] firstKey) throws IOException { public CloneableIterator<Row.Entry> rows(final boolean up, final byte[] firstKey) throws IOException {
final List<CloneableIterator<Row.Entry>> c = new ArrayList<CloneableIterator<Row.Entry>>(this.tables.size()); final List<CloneableIterator<Row.Entry>> c = new ArrayList<CloneableIterator<Row.Entry>>(this.tables.size());
final Iterator<Index> i = this.tables.values().iterator(); final Iterator<Index> i = this.tables.values().iterator();
@ -491,6 +515,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
return MergeIterator.cascade(c, this.entryOrder, MergeIterator.simpleMerge, up); return MergeIterator.cascade(c, this.entryOrder, MergeIterator.simpleMerge, up);
} }
@Override
public Iterator<Entry> iterator() { public Iterator<Entry> iterator() {
try { try {
return rows(); return rows();
@ -499,6 +524,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
} }
} }
@Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public synchronized CloneableIterator<Row.Entry> rows() throws IOException { public synchronized CloneableIterator<Row.Entry> rows() throws IOException {
final CloneableIterator<Row.Entry>[] c = new CloneableIterator[this.tables.size()]; final CloneableIterator<Row.Entry>[] c = new CloneableIterator[this.tables.size()];
@ -510,6 +536,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
return StackIterator.stack(c); return StackIterator.stack(c);
} }
@Override
public synchronized void close() { public synchronized void close() {
if (this.tables == null) return; if (this.tables == null) return;
/* /*
@ -527,6 +554,7 @@ public class SplitTable implements Index, Iterable<Row.Entry> {
this.tables = null; this.tables = null;
} }
@Override
public void deleteOnExit() { public void deleteOnExit() {
for (final Index i: this.tables.values()) i.deleteOnExit(); for (final Index i: this.tables.values()) i.deleteOnExit();
} }

@ -1788,7 +1788,7 @@ public final class Switchboard extends serverSwitch {
// there is a version that is more recent. Load it and re-start with it // there is a version that is more recent. Load it and re-start with it
this.log.logInfo("AUTO-UPDATE: downloading more recent release " + updateVersion.getUrl()); this.log.logInfo("AUTO-UPDATE: downloading more recent release " + updateVersion.getUrl());
final File downloaded = updateVersion.downloadRelease(); final File downloaded = updateVersion.downloadRelease();
final boolean devenvironment = new File(this.getAppPath(), ".svn").exists(); final boolean devenvironment = new File(this.getAppPath(), ".git").exists();
if (devenvironment) { if (devenvironment) {
this.log.logInfo("AUTO-UPDATE: omitting update because this is a development environment"); this.log.logInfo("AUTO-UPDATE: omitting update because this is a development environment");
} else if ((downloaded == null) || (!downloaded.exists()) || (downloaded.length() == 0)) { } else if ((downloaded == null) || (!downloaded.exists()) || (downloaded.length() == 0)) {

@ -435,7 +435,7 @@ public final class RWIProcess extends Thread
// we wait at most 30 milliseconds to get a maximum total waiting time of 300 milliseconds for 10 results // we wait at most 30 milliseconds to get a maximum total waiting time of 300 milliseconds for 10 results
long wait = waitTimeRecommendation(); long wait = waitTimeRecommendation();
if ( wait > 0 ) { if ( wait > 0 ) {
System.out.println("*** RWIProcess extra wait: " + wait + "ms; expectedRemoteReferences = " + this.expectedRemoteReferences.get() + ", receivedRemoteReferences = " + this.receivedRemoteReferences.get() + ", initialExpectedRemoteReferences = " + this.maxExpectedRemoteReferences.get()); //System.out.println("*** RWIProcess extra wait: " + wait + "ms; expectedRemoteReferences = " + this.expectedRemoteReferences.get() + ", receivedRemoteReferences = " + this.receivedRemoteReferences.get() + ", initialExpectedRemoteReferences = " + this.maxExpectedRemoteReferences.get());
Thread.sleep(wait); Thread.sleep(wait);
} }
// loop as long as we can expect that we should get more results // loop as long as we can expect that we should get more results

@ -26,6 +26,7 @@
package net.yacy.search.query; package net.yacy.search.query;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.SortedMap; import java.util.SortedMap;
@ -516,8 +517,8 @@ public final class SearchEvent
private final Semaphore trigger; private final Semaphore trigger;
public SecondarySearchSuperviser() { public SecondarySearchSuperviser() {
this.abstractsCache = new TreeMap<String, SortedMap<String, StringBuilder>>(); this.abstractsCache = Collections.synchronizedSortedMap(new TreeMap<String, SortedMap<String, StringBuilder>>());
this.checkedPeers = new TreeSet<String>(); this.checkedPeers = Collections.synchronizedSortedSet(new TreeSet<String>());
this.trigger = new Semaphore(0); this.trigger = new Semaphore(0);
} }
@ -527,16 +528,14 @@ public final class SearchEvent
* @param wordhash * @param wordhash
* @param singleAbstract // a mapping from url-hashes to a string of peer-hashes * @param singleAbstract // a mapping from url-hashes to a string of peer-hashes
*/ */
public void addAbstract(final String wordhash, final TreeMap<String, StringBuilder> singleAbstract) { public void addAbstract(final String wordhash, final SortedMap<String, StringBuilder> singleAbstract) {
final SortedMap<String, StringBuilder> oldAbstract; final SortedMap<String, StringBuilder> oldAbstract;
synchronized ( this.abstractsCache ) {
oldAbstract = this.abstractsCache.get(wordhash); oldAbstract = this.abstractsCache.get(wordhash);
if ( oldAbstract == null ) { if ( oldAbstract == null ) {
// new abstracts in the cache // new abstracts in the cache
this.abstractsCache.put(wordhash, singleAbstract); this.abstractsCache.put(wordhash, singleAbstract);
return; return;
} }
}
// extend the abstracts in the cache: join the single abstracts // extend the abstracts in the cache: join the single abstracts
new Thread() { new Thread() {
@Override @Override
@ -544,14 +543,12 @@ public final class SearchEvent
for ( final Map.Entry<String, StringBuilder> oneref : singleAbstract.entrySet() ) { for ( final Map.Entry<String, StringBuilder> oneref : singleAbstract.entrySet() ) {
final String urlhash = oneref.getKey(); final String urlhash = oneref.getKey();
final StringBuilder peerlistNew = oneref.getValue(); final StringBuilder peerlistNew = oneref.getValue();
synchronized ( oldAbstract ) {
final StringBuilder peerlistOld = oldAbstract.put(urlhash, peerlistNew); final StringBuilder peerlistOld = oldAbstract.put(urlhash, peerlistNew);
if ( peerlistOld != null ) { if ( peerlistOld != null ) {
peerlistOld.append(peerlistNew); peerlistOld.append(peerlistNew);
} }
} }
} }
}
}.start(); }.start();
// abstractsCache.put(wordhash, oldAbstract); // put not necessary since it is sufficient to just change the value content (it stays assigned) // abstractsCache.put(wordhash, oldAbstract); // put not necessary since it is sufficient to just change the value content (it stays assigned)
} }
@ -567,7 +564,6 @@ public final class SearchEvent
SortedMap<String, StringBuilder> urlPeerlist; SortedMap<String, StringBuilder> urlPeerlist;
int p; int p;
boolean hasURL; boolean hasURL;
synchronized ( this ) {
final Iterator<Map.Entry<String, SortedMap<String, StringBuilder>>> i = final Iterator<Map.Entry<String, SortedMap<String, StringBuilder>>> i =
this.abstractsCache.entrySet().iterator(); this.abstractsCache.entrySet().iterator();
while ( i.hasNext() ) { while ( i.hasNext() ) {
@ -588,7 +584,6 @@ public final class SearchEvent
wordlist += word; wordlist += word;
} }
} }
}
return wordlist; return wordlist;
} }

@ -9,8 +9,8 @@ Version: @REPL_VERSION@_@REPL_REVISION_NR@
Release: 3 Release: 3
License: GPL License: GPL
Group: Application/Internet Group: Application/Internet
Source0: svn://svn.berlios.de/yacy/trunk Source0: git@gitorious.org:yacy/rc1.git
URL: http://www.yacy.net/yacy/ URL: http://yacy.net
Requires: bash Requires: bash
Requires: sudo Requires: sudo
Requires: coreutils Requires: coreutils
@ -90,6 +90,7 @@ cp AUTHORS COPYRIGHT ChangeLog gpl.txt readme.txt ${RPM_BUILD_ROOT}$YACYDDIR/
install -m 744 *.sh ${RPM_BUILD_ROOT}$YACYCDIR/ # start/stop/kill scripts install -m 744 *.sh ${RPM_BUILD_ROOT}$YACYCDIR/ # start/stop/kill scripts
rm -r `find ${RPM_BUILD_ROOT}/ -type d -name '.svn'` # delete unwanted .svn-folders rm -r `find ${RPM_BUILD_ROOT}/ -type d -name '.svn'` # delete unwanted .svn-folders
rm -r `find ${RPM_BUILD_ROOT}/ -type d -name '.git'` # delete unwanted .git-folders
# location for init-script # location for init-script
install -d ${RPM_BUILD_ROOT}/etc/init.d/ install -d ${RPM_BUILD_ROOT}/etc/init.d/

Loading…
Cancel
Save