2013-05-16 4 views
5

संक्षेप में: मुझे गीथब पर होस्ट की गई फ़ाइल में अंतिम परिवर्तन की तारीख प्राप्त करने की आवश्यकता है।जांचें कि क्या Github में मेरी स्थानीय फ़ाइल का एक नया संस्करण है, R

लंबे समय में: गिटूब में मुझे एक फ़ाइल (एक आर वर्कस्पेस) है जो एक बार थोड़ी देर में अपडेट हो जाती है, मैं आर में एक फ़ंक्शन बनाना चाहता हूं जो जांचता है कि मेरी स्थानीय फ़ाइल एक से अधिक पुरानी है या नहीं रेपो (यदि आप उत्सुक हैं, तो मेरी प्रेरणा इस पोस्ट के अंत में सामने आती है)। This is the file मैं बात कर रहा हूँ।

सिद्धांत रूप में यह कुछ आसान होना चाहिए, क्योंकि प्रत्येक फ़ाइल में history page इसके साथ जुड़ा हुआ है, लेकिन मेरा ज्ञान यह जानने के लिए बहुत गरीब है कि इसके साथ क्या करना है। इसके अलावा, this Q मुझे php का उपयोग करने के कुछ तरीके से संकेत देने लगता है, लेकिन यह वास्तव में मेरे लिए टेरा गुप्त है, इसलिए मुझे नहीं पता कि यह किसी भी तरह से मदद कर सकता है या नहीं।

इसलिए, जैसा कि मैंने इस पोस्ट के संक्षिप्त संस्करण में कहा था, मुझे इस फ़ाइल के लिए अंतिम प्रतिबद्धता की तारीख को पुनर्प्राप्त करने का एक तरीका ढूंढना होगा। मैं इसे बाद में अपनी स्थानीय फाइल की प्रतिबद्ध तिथि से तुलना करने के लिए कुछ रास्ता ढूंढ सकता हूं।

अग्रिम धन्यवाद, जुआन

प्रेरणा: मैं आर मूल बातें में एक ऑनलाइन पाठ्यक्रम जो के लिए एक प्रणाली का उपयोग करता है में काम कर रहा हूँ स्वयं पता चल सके कि अभ्यास के समाधान सही हैं (यानी: छात्रों की जांच कर सकते तुरंत उनके परिणाम)। यह सिस्टम उन फ़ाइलों और डेटा के साथ फ़ाइल का उपयोग करता है जो नियमित रूप से अपडेट होते हैं क्योंकि मुझे अक्सर बग और नई समस्याएं मिलती हैं। तो मेरा लक्ष्य छात्रों को बताने के लिए एक समारोह है कि यदि कोई नई फ़ाइल उपलब्ध है। इसे डाउनलोड करने और पुराने को बदलने का तरीका ढूंढना भी साफ होगा, लेकिन यह अब माध्यमिक है।

उत्तर

2

समस्या डाउनलोड के गिट-टाइम को रखना है। नीचे दिया गया समाधान अगले चेक के लिए प्रत्येक डाउनलोड के बाद फ़ाइल समय को गिट तिथि पर सेट करता है।

library(RCurl) 
library(rjson) 
destination = "datos" # assume current directory 
repo = "https://api.github.com/repos/jumanbar/Curso-R/" 
path = "ejercicios-de-programacion/rep-3/datos" 
myopts = curlOptions(useragent="whatever",ssl.verifypeer=FALSE) 

d = fromJSON(getURL(paste0(repo,"commits?path=",path), 
       useragent="whatever",ssl.verifypeer=FALSE))[[1]] 
gitDate = as.POSIXct(d$commit$author$date) 
MustDownload = !file.exists(destination) | file.info(destination)$mtime > gitDate 
if (MustDownload){ 
    url = d$url 
    commit = fromJSON(getURL(url, .opts=myopts)) 
    files = unlist(lapply(commit$files,"[[","filename")) 
    rawfile = commit$files[[which(files==path)]]$raw_url 
    download.file(rawfile,destination,quiet=TRUE) 
    Sys.setFileTime(destination,gitDate) 
    print("File was downloaded") 
} 

यह आर उपयोगकर्ता की तरह दिखता है और ssl.verifypeer आवश्यक है; कमांड लाइन के बिना काम करता है। यदि आप सुरक्षा-जागरूक हैं, तो उस विषय पर तैरने वाले दस्तावेज़ पर दस्तावेज है, लेकिन मैंने प्रतिबद्ध करने का आसान मार्ग लिया।

+0

यह अद्भुत है धन्यवाद! मैं अभी भी आर से फ़ाइल डाउनलोड नहीं कर सकता हूं और मैं वास्तव में नहीं जानता कि 'useragent' या 'ssl.verifypeer' विकल्पों का क्या करना है। पूर्व के लिए मैंने "मोज़िला/5.0" का कोई फायदा नहीं लिया है। जब 'download.file' चलाया जाता है तो मुझे' विधि = "wget" 'या' curl "' और "URL स्कीम समर्थित नहीं है" (स्पेनिश से अनुवादित) का उपयोग करके "डाउनलोड को गैर-बाहर निकलने की स्थिति" मिलती है। वैसे भी, यह वही है जो मैं कर रहा था। – Juan

+0

स्ट्रिंग को ब्राउज़र में कच्चे फ़ाइल से डालने का प्रयास करें, और जांचें कि क्या आप इसे गिटूब में लॉग इन करते समय डाउनलोड कर सकते हैं। –

+0

वास्तव में मैं कर सकता हूं ... – Juan

2

ऐसा लगता है कि आपको जिथब रेपो के स्थानीय क्लोन की आवश्यकता है। इस पल के लिए आर के भाषा विनिर्देशों को भूलना (मुझे आर नहीं पता), गिट में आप git log के माध्यम से कई तरीकों से सबसे हालिया तारीख प्राप्त कर सकते हैं। git log मदद फ़ाइल (git help log) से, प्लेसहोल्डर धारा के तहत:

%cd: committer date 
%cD: committer date, RFC2822 style 
%cr: committer date, relative 
%ct: committer date, UNIX timestamp 
%ci: committer date, ISO 8601 format 

आप यूनिक्स टाइमस्टैम्प (1 जनवरी, 1970 की शुरुआत के बाद से सेकंड - बहुत आसानी से तुलनीय) प्राप्त कर सकते हैं सबसे हाल ही में की अपनी फ़ाइल के लिए प्रतिबद्ध , परियोजना जड़ से शुरू है, तो निम्न git log कमांड के साथ:

git log --format=%ct -1 -- ejercicios-de-programacion/rep-3/datos 

एक नंबर प्रदान करता है यही कारण है कि, जैसे 1368691710, लेकिन आप सूचीबद्ध अन्य प्रारूपों का भी उपयोग कर सकते हैं।

अब आपको अपनी परियोजना रूट के साथ काम करने वाली निर्देशिका के रूप में आर से इस सिस्टम कॉल को बनाने का एक तरीका ढूंढना होगा। This SO post मदद कर सकता है (लेकिन फिर से, मैं आर नहीं)।

+0

यह निश्चित रूप से मेरे कंप्यूटर में काम करेगा लेकिन दूसरों में नहीं (छात्र पीसी), इसलिए इस मामले में एक व्यवहार्य समाधान नहीं है। फिर भी धन्यवाद। – Juan

0

शायद आप "गिट स्टेटस" कमांड का उपयोग कर सकते हैं (जो आपको बताता है कि क्या नया काम करता है) cronjobs के साथ संयोजन। लेकिन इसके लिए आपको एक स्थानीय क्लोन चाहिए। और मैंने कभी cronjob के अंदर कमांड के आउटपुट का उपयोग करने की कोशिश नहीं की।

+0

यदि रिमोट में नए काम हैं जो आपने नहीं लाए हैं, तो 'गिट स्टेटस' आपको नहीं बताएगा। आपको पहले 'fetch' git करना होगा। –

संबंधित मुद्दे