10/17/2011

mkmmc.sh for TI platform

TI使用mkmmc.sh來切partition和製作image...

之前因為不習慣vmplay外加硬碟要被吃光了...所以只好重灌順便來試試Ubuntu 11.04

但奇怪的是,之後在用mkmmc.sh時竟然沒辦作切parttition,一直說格式錯誤 :

===============
$ sudo ./mkmmc-android.sh /dev/sdc
Assuming Default Locations for Prebuilt Images
All data on /dev/sdc now will be destroyed! Continue? [y/n]
y
[Unmounting all existing partitions on the device ]
umount:/dev/sdc: 未掛載
[Partitioning /dev/sdc...]
磁碟 /dev/sdc 不包含有效的分割表
DISK SIZE - bytes
(standard_in) 1: syntax error
CYLINDERS -
expr: 格式錯誤
[Making filesystems...]
[Copying files...]
mount:特殊裝置 /dev/sdc1 不存在
[Copying START_HERE floder to boot partition]
umount:/dev/sdc1: 找不到
mount:特殊裝置 /dev/sdc2 不存在
umount:/dev/sdc2: 找不到
[Copying all clips to data partition]
mount:特殊裝置 /dev/sdc3 不存在
umount:/dev/sdc3: 找不到
[Done]
===============

當初還以為是Ubuntu 11.04的問題勒....

在細看script之後,才發現是因為 awk 要去取得fdisk print出來的資料,但因為語系的問題而造成擷取錯誤....

只要把語系改成英文就好了

$ export LANG=C

9/30/2011

Git patch



最近為了發佈patch煩惱中....因為對於GIT還不是能運用自如,但下面找到很不錯的文章,解決我的困擾^^


UNIX世界的軟件開發大多都是協作式的,因此,Patch(補丁)是一個相當重要的東西,因為幾乎所有的大型UNIX項目的普通貢獻者,都是通過Patch來提交代碼的。作為最重要的開源項目之一,Linux,也是這樣的。普通開發者從軟件倉庫clone下代碼,然後寫入代碼,做一個Patch,最後用E-mail發給Linux Kernel的維護者就好了。Git最初作為Linux的版本控制工具,提供了透明、完整、穩定的Patch功能。
我們先介紹一下Patch是什麼。如果一個軟件有了新版本,我們可以完整地下載新版本的代碼進行編譯安裝。然而,像Linux Kernel這樣的大型項目,代碼即使壓縮,也超過70MB,每次全新下載是有相當大的代價的。然而,每次更新變動的代碼可能不超過1MB,因此,我們只要能夠有兩個版本代碼的diff的數據,應該就可以以極低的代價更新程序了。因此,Larry Wall開發了一個工具:patch。它可以根據一個diff文件進行版本更新。
不過在git中,我們沒有必要直接使用diff和patch來做補丁,這樣做既危險又麻煩。git提供了兩種簡單的patch方案。一是用git diff生成的標準patch,二是git format-patch生成的Git專用Patch。

1.git diff生成的標準patch

我們可以首先用git diff製作一個patch。本文示例的工作目錄裡最初有一個文件a,內容是“This is the file a.”,放置在master分支中。為了修改代碼,我們一般的做法是建立一個新分支:
sweetdum@sweetdum-ASUS:~/GitEx$ git branch Fix
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout Fix
Switched to branch ‘Fix’
接下來我們在a文件裡面追加一行,然後執行git diff。
sweetdum@sweetdum-ASUS:~/GitEx$ echo ‘Fix!!!’>>a
sweetdum@sweetdum-ASUS:~/GitEx$ git diff
diff –git a/a b/a
index 4add65f..0d295ac 100644
— a/a
+++ b/a
@@ -1 +1,2 @@
This is the file a.
+Fix!!!
我們看到了Git diff的輸出,這是一個非常典型的Patch式diff。這樣我們可以直接把這個輸出變為一個Patch:
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m “Fix”
[Fix b88c46b] Fix
1 files changed, 1 insertions(+), 0 deletions(-)
sweetdum@sweetdum-ASUS:~/GitEx$ git diff master > patch
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master
Switched to branch ‘master’
我們現在有一個patch文件,並且簽出了master,接下來我們可以使用git apply來應用這個patch。當然了,實際應用中,我們不會這樣在一個分支建patch,到另一個分支去應用,因為只有merge一下就好了。我們現在權當沒有這個Fix分支。一般情況下,為了保護master,我們會建立一個專門處理新交來的patch的分支:
sweetdum@sweetdum-ASUS:~/GitEx$ git branch PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout PATCH
Switched to branch ‘PATCH’
sweetdum@sweetdum-ASUS:~/GitEx$ git apply patch
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m “Patch Apply”
[PATCH 9740af8] Patch Apply
1 files changed, 1 insertions(+), 0 deletions(-)
看,現在我們在PATCH分支中應用了這個補丁,我們可以把PATCH分支和Fix比對一下,結果肯定是什麼也沒有,說明PATCH分支和Fix分支完全一樣。patch應用成功。即使有多個文件git diff 也能生成一個patch。

2.git format-patch生成的git專用補丁。

我們同樣用上面那個例子的工作目錄,這次,我們在Fix分支中的a添加了新行之後,用git format-patch生成一個patch。
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout Fix
Switched to branch ‘Fix’
sweetdum@sweetdum-ASUS:~/GitEx$ echo ‘Fix!!!’>>a
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m “Fix1″
[Fix 6991743] Fix1
1 files changed, 1 insertions(+), 0 deletions(-)
sweetdum@sweetdum-ASUS:~/GitEx$ git format-patch -M master
0001-Fix1.patch
git format-patch的-M選項表示這個patch要和那個分支比對。現在它生成了一個patch文件,我們看看那是什麼:
sweetdum@sweetdum-ASUS:~/GitEx$ cat 0001-Fix1.patch
From 6991743354857c9a6909a253e859e886165b0d90 Mon Sep 17 00:00:00 2001
From: Sweetdumplings
Date: Mon, 29 Aug 2011 14:06:12 +0800
Subject: [PATCH] Fix1

a |    1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff –git a/a b/a
index 4add65f..0d295ac 100644
— a/a
+++ b/a
@@ -1 +1,2 @@
This is the file a.
+Fix!!!

1.7.4.1
看,這次多了好多東西,不僅有diff的信息,還有提交者,時間等等,仔細一看你會發現,這是個E-mail的文件,你可以直接發送它!這種patch,我們要用git am來應用。
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout master
Switched to branch ‘master’
sweetdum@sweetdum-ASUS:~/GitEx$ git branch PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git checkout PATCH
sweetdum@sweetdum-ASUS:~/GitEx$ git am 0001-Fix1.patch
Applying: Fix1
sweetdum@sweetdum-ASUS:~/GitEx$ git commit -a -m “PATCH apply”
在提交了補丁之後,我們可以再看看目前文件a的情況:
sweetdum@sweetdum-ASUS:~/GitEx$ cat a
This is the file a.
Fix!!!
果然,多了一個Fix!!!
不過要注意的是,如果master與Fix分支中間有多次提交,它會針對每次提交生成一個patch。

3.兩種patch的比較:

  • 兼容性:很明顯,git diff生成的Patch兼容性強。如果你在修改的代碼的官方版本庫不是Git管理的版本庫,那麼你必須使用git diff生成的patch才能讓你的代碼被項目的維護人接受。
  • 除錯功能:對於git diff生成的patch,你可以用git apply –check 查看補丁是否能夠乾淨順利地應用到當前分支中;如果git format-patch 生成的補丁不能打到當前分支,git am會給出提示,並協助你完成打補丁工作,你也可以使用git am -3進行三方合併,詳細的做法可以參考git手冊或者《Progit》。從這一點上看,兩者除錯功能都很強。
  • 版本庫信息:由於git format-patch生成的補丁中含有這個補丁開發者的名字,因此在應用補丁時,這個名字會被記錄進版本庫,顯然,這樣做是恰當的。因此,目前使用Git的開源社區往往建議大家使用format-patch生成補丁。

Tutorial VIM on interrnet

無意中發現一個很棒的網站,線上教學的VIM

http://www.openvim.com/tutorial.html

當然這些都只是非常基本的操作

但感覺真的很不錯 !

9/16/2011

GIT 相關script 和 自定義快速鍵


=======================================

function git_branch {
    ref=$(git symbolic-ref HEAD 2> /dev/null) || return;
    echo "("${ref#refs/heads/}") ";
}

function git_since_last_commit {
    now=`date +%s`;
    last_commit=$(git log --pretty=format:%at -1 2> /dev/null) || return;
    seconds_since_last_commit=$((now-last_commit));
    minutes_since_last_commit=$((seconds_since_last_commit/60));
    hours_since_last_commit=$((minutes_since_last_commit/60));
    minutes_since_last_commit=$((minutes_since_last_commit%60));
    
    echo "${hours_since_last_commit}h${minutes_since_last_commit}m ";
}

PS1="[\[\033[1;32m\]\w\[\033[0m\]] \[\033[0m\]\[\033[1;36m\]\$(git_branch)\[\033[0;33m\]\$(git_since_last_commit)\[\033[0m\]$ "

=======================================

把上面的程式貼到 ~/.bash_profile,如果沒有就新建。

如果shell重啟之後沒反應,可以直接在~/.bashrc加入,讓它自動幫你執行 :

if [ -f ~/.bash_profile ]; then                                                                                                                           
    . ~/.bash_profile
fi

好了之後,重啟shell就會變成這樣 :DDD



顯示在哪個branch之下,還有溫馨小提示有多久沒有commit了 XD


常用的git alias :
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch

GIT STATUS


git status主要就是用來看目前working directory中所有檔案的情形,主要有下列幾種狀態
1. project file
就是原來就已經在GIT裡面並且沒有被更改過的檔案,這類型的檔案在git status中並不會列出來。
2. modified file
如果你更動任何一個project file,那隻檔案的狀態就會變成modified。
3. untracked file
所有新增出來、還沒用git add加到project裡面的檔案,他們的狀態就會是untracked。
這些檔案裡面可能有你新增的程式,也有可能是你在make的過程中動到或產生的中間檔。
如果是前者,記得在commit之前先add,如果是後者,就不需要理了,就讓它們留在untracked裡面就行了。
4. new file
untracked file被git add之後,狀態就會變成new file,commit之後就變成project file。

git status的output會根據你的color.status來決定要不要讓輸出結果帶有顏色 (或直接設定color.ui為auto)
$ git config --global color.ui auto
or
$ git config --global color.status true
如此一來,git status的output便會有顏色了。(有顏色好看很多)


如果git status後面不加path,會對整個working directory下的檔案檢查;如果後面有加路徑的話,就只會指定路徑下的所有檔案做檢查。
$ git status .
$ git status ./foo

註: 如果你目前不是在.git的同一層目錄的話,git會一直往parent目錄往上找到.git目錄,所以不必特別cd回.git那層目錄就可以做git操作了。

另外,git好像到了1.7.0.4之後,git-status多了幾個參數可以使用,個人最推的是 -s
-s, --short
用簡潔的格式來印出結果
ex.
$ git status
# On branch new
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       new file:   kkkk
#
$ git status -s
A  kkkk

前面的A代表added,另外還有幾個字母
M = modified
D = deleted
R = renamed
C = copied
U = updated but unmerged

最常見的的狀態:
? ?: untracked
A: new
M: Modified but not added
M  : Modified and added
MM: Modified again after added
  D: deleted project file
完整的format可以用git help status查詢OUTPUT那一節,在這裡就不列出來了。

--porcelain
porcelain的翻譯是"瓷" (f-__-),加這個參數的意義是輸出來的結果會讓script較易於處理,不過目前這個參數其實是指到--short,結果是一樣的。
-u[], --untracked-files[=]
這個參數是用來設定如何顯示untracked files的狀態
mode (Default all)
no:     不顯示untracked files
normal: 顯示untracked files & directories,但untracked directories裡面的內容則不列出來
例如,新產生了一個newdir,newdir目錄裡面又有子目錄及其他檔案,在normal mode的時候,在status裡只會列出一行newdir/。
all:    將所有untracked files列出來,包含在untracked directories裡面的,所以用all的話列出來就會是落落長一大串。

-z
用NUL代替LF當成行的結尾,應該也是為了要把結果output給script處理而設計的,和--porcelain搭配使用。