2008-09-23 9 views
8

मैं इस आदेश के बारे में पता कर रहा हूँ: cvs log -N -w<userid> -d"1 day ago"खोज करने के लिए कैसे सीवीएस टिप्पणी इतिहास

दुर्भाग्य से यह उस में नई-पंक्तियों के बहुत सारे हैं, जैसे कि फ़ाइल-पथ, फ़ाइल-संस्करण के साथ एक प्रारूपित रिपोर्ट उत्पन्न करता है, और टिप्पणी -टेक्स्ट सभी अलग लाइनों पर हैं। इसलिए टिप्पणी टेक्स्ट की सभी घटनाओं के लिए इसे स्कैन करना मुश्किल है, (उदाहरण के लिए, grep), और मैचों को फ़ाइल/संस्करण से सहसंबंधित करना मुश्किल है।

(ध्यान दें कि लॉग उत्पादन, पूरी तरह से स्वीकार्य हो सकता है अगर केवल सीवीएस छानने देशी रूप प्रदर्शन कर सकता है।)

संपादित करें: नमूना उत्पादन। इस तरह पाठ का एक ब्लॉक प्रत्येक भंडार फ़ाइल के लिए रिपोर्ट किया गया है:

 

RCS file: /data/cvs/dps/build.xml,v 
Working file: build.xml 
head: 1.49 
branch: 
locks: strict 
access list: 
keyword substitution: kv 
total revisions: 57; selected revisions: 1 
description: 
---------------------------- 
revision 1.48 
date: 2008/07/09 17:17:32; author: noec; state: Exp; lines: +2 -2 
Fixed src.jar references 
---------------------------- 
revision 1.47 
date: 2008/07/03 13:13:14; author: noec; state: Exp; lines: +1 -1 
Fixed common-src.jar reference. 
============================================================================= 

उत्तर

9

-w विकल्प -S विकल्प के साथ बेहतर काम करने लगते हैं। अन्यथा अतिरिक्त परिणाम हैं जो उपयोगकर्ता आईडी से संबंधित प्रतीत नहीं होते हैं। शायद कोई इसे समझा सकता है।

cvs log -N -S -w<userid> -d"1 day ago" 
इसी के साथ

मैं उचित सफलता ग्रेप को यह पाइप हो रही किया गया है:

cvs log -N -S -w<userid> -d"1 day ago" | grep -B14 "some text" > afile 

मैं एक फाइल करने के लिए उत्पादन पुनः निर्देशित कर रहा हूँ के बाद से सीवीएस लॉग शोर है और मुझे यकीन है कि कैसे बनाने के लिए नहीं कर रहा हूँ यह चुप मुझे लगता है कि एक विकल्प stderr को /dev/null पर रीडायरेक्ट करना है।

+1

यह भयानक स्टीव है। मुझे -b grep विकल्प से अवगत नहीं था: "प्रमुख संदर्भ की NUM पंक्तियां मुद्रित करें"। तो 15-पंक्ति रिपोर्ट के साथ कि प्रत्येक फ़ाइल के लिए सीवीएस लॉग उत्पन्न होता है (टिप्पणी 15 वीं होती है), -बी 14 मुझे प्रत्येक मिलान फ़ाइल के लिए पूरा ब्लॉक देता है। –

+0

स्पष्ट रूप से यह सबसे अच्छा काम करता है जब आप जिस पाठ को खोज रहे हैं वह पहली पंक्ति में है, लेकिन इसकी शुरुआत है। –

+1

वैसे, सीवीएस लॉग-एन-एस-डब्ल्यू-डी "1 दिन पहले" डिफ़ॉल्ट रूप से 1 दिन पहले पुरानी प्रविष्टियों की तलाश करेगा। मुझे लगता है कि आप क्या चाहते हैं यह है-> "1 दिन पहले" –

0

इस तरह overkill हो सकता है, लेकिन आप git-cvsimport इस्तेमाल कर सकते हैं एक Git भंडार को सीवीएस इतिहास आयात और Git के उपकरण का उपयोग कर यह खोज करने के लिए। न केवल आप प्रतिबद्ध संदेशों के भीतर पाठ की खोज कर सकते हैं, लेकिन आप उस कोड की खोज भी कर सकते हैं जिसे कभी भी जोड़ा गया है या आपके भंडार में फ़ाइलों से हटा दिया गया है।

+2

और यह कैसे किया जाएगा? – dokaspar

0

CVSSearch मदद कर सकता है, लेकिन यह एक सीजीआई आवेदन दिया गया है: '(

2

मेरा पहला विचार egrep (या ग्रेप -E उपयोग करने के लिए थे, मुझे लगता है) इस तरह के रूप में कई पैटर्न के लिए खोज करने के लिए:

<Cmd> | egrep 'Filename:|Version:|Comment:' 

लेकिन तब मुझे एहसास हुआ कि आप अधिक बुद्धिमानी से फ़िल्टर करना चाहते हैं।

उस अंत में, मैं आउटपुट लाइन-बाय-लाइन को संसाधित करने के लिए अजीब (या perl) का उपयोग करता हूं, जब आपको ब्याज का एक अनुभाग मिलता है तो एक इको चर सेट करना; छद्म कोड यहां:

# Assume the sections are of the format: 
# Filename: <filename> 
# Version: <version> 
# Comment: <comment> 
#    <more comment> 

Set echo to false 
While more lines left 
    Get line 
    If line starts with "Filename: " and <filename> is of interest 
     Set echo to true 
    If line starts with "Filename: " and <filename> is not of interest 
     Set echo to false 
    If echo is true 
     Output line 
End while 
+0

पोस्ट-प्रोसेसिंग समाधान का मुश्किल हिस्सा यह है कि सामग्री के ब्याज टेक्स्ट ब्लॉक के बाद के हिस्से में हैं। इसलिए प्रत्येक ब्लॉक को बफर करना आवश्यक होगा, फिर उसे छोड़ दें या आउटपुट करें। मुझे विश्वास है कि यह बहुत कुछ कर सकता है, लेकिन इसमें शायद मेरे लिए एक बहु-दिन परियोजना शामिल होगी। –

1

यहाँ मैं क्या किया है - एक सरल जावा स्क्रिप्ट:

import java.io.IOException; 


public class ParseCVSLog 
{ 

    public static final String CVS_LOG_FILE_SEPARATOR = "============================================================================="; 
    public static final String CVS_LOG_REVISION_SEPARATOR = "----------------------------"; 
    public static final String CVS_LOG_HEADER_FILE_NAME = "Working file"; 
    public static final String CVS_LOG_VERSION_PREFIX = "revision"; 

    public static void main(String[] args) throws IOException 
    { 
     String searchString = args[0]; 

     System.out.println("SEARCHING FOR: " + searchString); 

     StringBuffer cvsLogOutputBuffer = new StringBuffer(); 
     byte[] bytes = new byte[1024]; 
     int numBytesRead = 0; 
     while((numBytesRead = System.in.read(bytes)) > 0) 
     { 
      String bytesString = new String(bytes, 0, numBytesRead); 
      cvsLogOutputBuffer.append(bytesString); 
     } 

     String cvsLogOutput = cvsLogOutputBuffer.toString(); 

     String newLine = System.getProperty("line.separator"); 
     String[] fileArray = cvsLogOutput.split(CVS_LOG_FILE_SEPARATOR); 


     for (String fileRecord : fileArray) 
     { 
      if (!fileRecord.contains(searchString)) 
      { 
       continue; 
      } 

      String[] revisionArray = fileRecord.split(CVS_LOG_REVISION_SEPARATOR); 
      String[] fileHeaderLineArray = revisionArray[ 0 ].split(newLine); 
      String fileName = ""; 
      for (String fileHeadeLine : fileHeaderLineArray) 
      { 
       if (fileHeadeLine.contains(CVS_LOG_HEADER_FILE_NAME)) 
       { 
        fileName = fileHeadeLine.split(": ")[ 1 ]; 
        break; 
       } 
      } 
      System.out.print(fileName); 
      for (int i = 1; i < revisionArray.length; i++) 
      { 
       String versionRecord = revisionArray[ i ]; 
       if (!versionRecord.contains(searchString)) 
       { 
        continue; 
       } 
       String[] versionLineArray = versionRecord.split(newLine); 
       for (String versionLine : versionLineArray) 
       { 
        if (versionLine.contains(CVS_LOG_VERSION_PREFIX)) 
        { 
         System.out.print(" " + versionLine.split(" ")[ 1 ]); 
        } 
       } 

      } 
      System.out.println(); 
     } 
    } 
} 

और यहाँ है मैं इसे कैसे इस्तेमाल किया:

cvs log -N -S -washamsut | java ParseCVSLog GS-242 
4

आप cvsps चाहते हैं - जो सीवीएस इतिहास से patchsets उत्पन्न होगा। फिर, आपके पास सीवीएसपीएस आउटपुट में केवल आपकी टिप्पणी का एक उदाहरण होना चाहिए,

1

यह कमांड और गॉक स्क्रिप्ट मुझे प्रत्येक लॉग एंट्री के केवल फ़ाइल नाम, दिनांक और टिप्पणी पंक्ति को खोजने में मदद करता है।

cvs log -N -S -b -w<userid> -d ">1 day ago" 2>/dev/null | gawk 'BEGIN{out=0;} /^Working file:/ { print $0; } /^date:/ { out=1; } /^===/ { print ""; out=0; } (out==1){print $0;}' 
संबंधित मुद्दे