2011-07-29 67 views
1

我想比較bazaar分支lp中的幾個文件:ubuntu/nvidia-graphics-drivers。我主要對該分支內的debian子目錄感興趣,但由於http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/oneiric/nvidia-graphics-drivers/oneiric/files中的二進制blob,需要很長時間才能獲取文本文件。我已經下載了555MB,它仍在計數。如何在分支/檢出時忽略某些文件?

是否有可能通過以下特性中的一個來檢索一個集市分支,包括或排除某些文件:

  • 文件大小
  • 文件擴展
  • 文件名(僅包括debian/例如)

我不需要推回任何更改,也不需要查看文件的歷史記錄。我只想比較debian/目錄中的兩個文件,.in擴展名的文件和沒有的文件。

回答

0

因爲bzr info "$branch"bzr ls -d "$branch" "$directory"沒有提供足夠的信息給我,所以我最終對HTTP響應做了一些髒抹掉。

下面的Bash腳本依賴於Launchpads前端Loggerhead的工作。它遞歸地從給定的URL下載。目前,它忽略了*.run文件。將其另存爲bzrdl$PATH可用的目錄中,並使用bzrdl http://launchpad.net/~ubuntu-branches/ubuntu/oneiric/nvidia-graphics-drivers/oneiric/files/head:/debian/運行它。所有文件將保存在當前目錄中,確保它是空的以避免衝突。

#!/bin/bash 
max_retries=5 
rooturl="$1" 
if ! [[ $rooturl =~ /$ ]]; then 
    echo "Usage: ${0##*/} URL" 
    echo "URL must end with a slash. Example URL:" 
    echo "http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/oneiric/nvidia-graphics-drivers/oneiric/files/head:/" 
    exit 1 
fi 
tmpdir="$(mktemp -d)" 
target="$(pwd)" 
# used for holding HTTP response before extracting data 
tmp="$(mktemp)" 
# url_filter reads download URLs from stdin (piped) 
url_filter() { 
    grep -v '\.run$' 
} 
get_files_from_dir() { 
    local slash=/ 
    local dir="$1" 
    # to avoid name collision: a/b/c/ -> a.d/b.d/c.d/ 
    local storedir="${dir//$slash/.d${slash}}" 
    mkdir -p "$tmpdir/$storedir" "$target/$dir" 
    local i subdir 
    for ((i=0; i<$max_retries; i++)); do 
     if wget -O "$tmp" "$rooturl$dir"; then 
      # store file list 
      grep -F -B 1 '<img src="/static/images/ico_file_download.gif" alt="Download File" />' "$tmp" |\ 
       grep '^<a' | cut -d '"' -f 2 | url_filter \ 
       > "$tmpdir/$storedir/files" 
      IFS=$'\n' 
      for subdir in $(grep -F -B 1 '<img src="/static/images/ico_folder.gif" ' "$tmp" | \ 
       grep -F '<a ' | rev | cut -d/-f 2 | rev); do 
       IFS=$' \t\n' 
       get_files_from_dir "$dir$subdir/" 
      done 
      return 
     fi 
    done 
    echo "Failed to download directory listing of: $dir" >> "$tmpdir/errors" 
} 
download_files() { 
    local slash=/ 
    local dir="$1" 
    # to avoid name collision: a/b/c/ -> a.d/b.d/c.d/ 
    local storedir="${dir//$slash/.d${slash}}" 
    local done=false 
    local subdir 
    cd "$tmpdir/$storedir" 
    for ((i=0; i<$max_retries; i++)); do 
     if wget -B "$rooturl$dir" -nc -i files -P "$target/$dir"; then 
      done=true 
      break 
     fi 
    done 
    $done || echo "Failed to download all files from $dir" >> "$tmpdir/errors" 
    for subdir in *.d; do 
     download_files "$dir${subdir%%.d}/" 
    done 
} 
get_files_from_dir '' 
# make *.d expand to nothing if no directories are found 
shopt -s nullglob 
download_files '' 
echo "TMP dir: $tmpdir" 
echo "Errors : $(wc -l "$tmpdir/errors" 2>/dev/null | cut -d ' ' -f 2 || echo 0)" 

的臨時目錄和文件事後又沒有刪除,必須手動完成。任何錯誤(故障下載)將被寫入$tmpdir/errors

它證實了工作:

bzrdl http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/oneiric/nvidia-settings/oneiric/files/head:/debian/ 

隨時糾正任何錯誤或增加改進。

1

據我所知,沒有。您正在下載分支歷史記錄,而不僅僅是單個文件。每個文件都是分支歷史的一個組成部分。

在光明的一面,你只需要檢查一次。除非這些二進制文件發生變化,否則在下次從Launchpad中取出時它們將被跳過。

根據分行的歷史記錄,如果您使用輕量級結賬bzr checkout --lightweight),則可能可以減少下載大小。但是,當然,這可能會在稍後再回來並咬你,因爲這意味着你不會得到分支的本地副本,只有檢出的文件。所以它會像SVN一樣工作,每個操作都必須通過服務器。只要你不需要查看分支歷史記錄,或者做出改變,我相信這應該可以爲你提供很好的服務。

+0

現在我想'--lightweight'和文件大小雖然仍然大約爲280MB(磁盤上的實際大小:61M),但文件大小已經大大減小。我仍然在尋找一種忽略這些文件的替代方法。是否有可能使用類似'bzr cat lp:ubuntu/nvidia-graphics-drivers/debian/control'來從存儲庫檢索某些文件? – Lekensteyn

+0

我相信你也可以直接從Launchpad做到這一點。它不是讓你從存儲庫下載單個文件嗎?但是,是的,看起來像'貓的bzr -d '也應該這樣做,雖然我還沒有嘗試過 – jalf

+0

我問錯了問題的意見,LP允許個人下載,但因爲我想比較整個目錄,手動下載這些工作太多了。出於某種原因,每次操作嘗試下載完整的樹或東西('的bzr貓LP:Ubuntu的/ NVIDIA顯卡的驅動程序/於Debian/control')。下次我將使用wget。 – Lekensteyn

0

雖然我們有計劃在將來添加此類支持,但目前沒有辦法從Bazaar分支有選擇地檢出特定目錄。

考慮到分支的大小,克隆的流量確實太多了。這可能是客戶端實現中的一個錯誤。

這裏就BZR 2.4它仍然是相當緩慢的,但不是太糟糕(60):

localhost:/tmp% bzr branch http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/oneiric/nvidia-settings/oneiric 
Most recent Ubuntu Oneiric version: 275.09.07-0ubuntu1         
Packaging branch status: CURRENT 
Branched 37 revision(s). 

從日誌:

[11866] 2011-07-31 00:56:57.007 INFO: Branched 37 revision(s). 
56.786 Transferred: 5335kB (95.8kB/s r:5314kB w:21kB) 
+0

555MB分支來自'bzr分支lp:ubuntu/nvidia-graphics-drivers'。我正在運行集市2.3.1 – Lekensteyn

+0

你有沒有嘗試通過http而不是ssh獲取(lp:默認爲ssh)? – jelmer

+0

是的,同樣是。 – Lekensteyn

相關問題