- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

はじめに Edit

Drupalのバージョンアップ方法は、公式では
一旦ファイル一式を削除(移動)しておいて、更新、みたいになっていて、
すごく面倒です。頻繁にバージョンアップがあるDrupalで、そんなことやってられません。

ので、それを簡単に行う方法

sshなどシェルが使えるときの方法 Edit

Rubyでdiffをとるスクリプトを書いてみました。

2つの指定バージョンのアーカイブをダウンロードしてきて、
解凍し、パッチを自動的に作ります。

必要なもの:
Windowsなら、ActiveScriptRubyが必要です。
フリーソフトのrecycle.exe、wget,tar,diff(これらはcygwinで動作確認)が必要です。recycle.exeがない場合は RM_COMMANDをrm -rf に置き換えればいけます(その分危険ですが)。

使い方例:(バージョン5.11から5.12へのパッチを作る)

ruby make-patch.rb 5.11 5.12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/usr/bin/env ruby

# make-patch.rb
# this is patch making script

# dependency of this script
#  ActiveScriptRuby  http://arton.hp.infoseek.co.jp/indexj.html
#  recycle.exe  http://www.tsg.ne.jp/GANA/S/recycle/index.html
#  wget  at cygwin
#  tar   at cygwin
#  diff  at cygwin

### variables ###
# specify tags
# ref. "Sticky Tag" of following site.
# http://cvs.drupal.org/viewvc.py/drupal/drupal/
OLD_VERSION = ARGV[0] || "5.11"  # old version revision tag
NEW_VERSION = ARGV[1] || "5.12"  # new version revision tag

REMOVES_GABEGE = true

# patchname
PATCH_NAME = "#{OLD_VERSION}_to_#{NEW_VERSION}.patch"

# remove command
RM_COMMAND = "recycle.exe -y" # http://www.tsg.ne.jp/GANA/S/recycle/index.html
# RM_COMMAND = "rm -rf"

# URL for update status. return XML
UPDATE_STATUS_URL = "http://updates.drupal.org/release-history/drupal/5.x"


require "rexml/document"
require "open-uri"

## delete
def delete_file(file)
  print "delete: #{file}..."
  `#{RM_COMMAND} #{file}`
  puts "done"
end

## get_dir
class String
  def dir
    File::basename self, '.tar.gz'
  end
end

## get URLs
def get_download_urls(status_url, old_ver, new_ver)
  old_download_url = nil
  new_download_url = nil
  
  # analyze XML of status URL
  doc = REXML::Document.new open(status_url)
  doc.elements.each("project/releases/release") do |element|
    if element.elements["version"].text == old_ver
      old_download_url = element.elements["download_link"].text
    end
    if element.elements["version"].text == new_ver
      new_download_url = element.elements["download_link"].text
    end
    break if new_download_url && old_download_url
  end
  raise "new download url is not found!! NEW_VERSION is mistake." unless new_download_url
  raise "old download url is not found!! OLD_VERSION is mistake." unless old_download_url
  
  [old_download_url, new_download_url]
end

def download_and_decompress(url)
  filename = File::basename(url)
#  delete_file(filename) if File.exist?(filename)
  
  # download
  `wget #{url}` unless File.exist?(filename)
  
  # decompress
  `tar xfz #{filename}` unless File.exist?(filename.dir)
end

def make_patch(filenames, patch_name)
  old_dir = filenames[0].dir
  new_dir = filenames[1].dir
  `diff -u -r #{old_dir} #{new_dir}> #{patch_name}`
end

def remove_gabege(filenames)
  def remove_by_url(filename)
    delete_file(filename)
    delete_file(filename.dir)
  end
  
  filenames.each {|filename| remove_by_url(filename) }
end

### main ###
puts "analyze download url"
urls = get_download_urls(UPDATE_STATUS_URL, OLD_VERSION, NEW_VERSION)

puts "download and decompress"
urls.each {|url| download_and_decompress(url)}

filenames = urls.map {|url| File::basename(url) }

puts "make patch"
make_patch(filenames, PATCH_NAME)

puts "make diff files"
#make_diff_files(filenames)

puts "remove gabege"
remove_gabege(filenames) if REMOVES_GABEGE

puts "finished all!!"

あとは、インストールしたサーバーでpatchを使えばOK。
例:

patch -p1 < ../5.11_to_5.12.patch

シェルが使えないときの方法。 Edit

patchが使えない、FTPしか使えない、とかの状況のとき、
もし必要になったらここに書くと思う。

指針としては、上記スクリプトに、
diff -qで更新ファイルを列挙し、ダウンロードして
解凍してきた更新ファイルのみを残して
他を削除するスクリプトを追加する、といったところでしょうか。


Show recent 10 comments. Go to the comment page.

  • スクリプトのミスを修正
    -3d09f9d6241a0abdc6f93f56b2ae994deOLD_VERSION = "5.11" || ARGV[0]  # old version revision tag
    -21e65b25230f5bb19f04952f22fc21263NEW_VERSION = "5.12" || ARGV[1]  # new version revision tag
    +OLD_VERSION = ARGV[0] || "5.11"  # old version revision tag
    +NEW_VERSION = ARGV[1] || "5.12"  # new version revision tag
    
    • TOBY 2008-12-18 (Thu) 18:09:40
Name:

Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2008-12-18 Thu 18:08:13 JST (3284d)