Twitter4J開発手順メモ(私家版の作り方)

いつもTwitter4Jの機能追加をするたびに試行錯誤することが多いので備忘録代わりにまとめておきます。

# 前提

- ~~AndroidStudio~~ IntelliJ IDEA で Twitter4J の機能追加や調査・修正といった作業をする。
 - AndroidStudio2.1あたりからmavenがサポートされてないっぽいんで IDEA で。
- Windows10
- TortoiseGit

# Forkして最新版を取得する

https://github.com/yusuke/twitter4j を Fork する(https://github.com/takke/twitter4j)

clone したり色々やって下記の状態。

```bash
$ git branch -a
* master
  video_support
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/video_support
  remotes/upstream/2.0.x
  remotes/upstream/2.1.x
  remotes/upstream/2.2.x
  remotes/upstream/TFJ-671
  remotes/upstream/TFJ-679-api1.1
  remotes/upstream/master
  remotes/upstream/revert-171-TFJ-806
```

## 最新に追いつく

作業するたびに```origin/master```がけっこう古くなってるので最新版をマージする。

[GitHubでFork/cloneしたリポジトリを本家リポジトリに追従する - Qiita](http://qiita.com/xtetsuji/items/555a1ef19ed21ee42873) などを参考に。


```bash
$ git fetch upstream
...
$ git log origin/master -1
commit 96b7f3487910febc39ec1f8230f2b847b49c0d97
Author: Yusuke Yamamoto <yusuke@mac.com>
Date:   Mon Mar 23 16:26:33 2015 +0900

    fix for KryoSerializationTest

$ git log upstream/master -1
commit 45f7de95a22a42167099c53849042cb1f88c8963
Author: Yusuke Yamamoto <yusuke@mac.com>
Date:   Tue Jun 9 23:41:45 2015 +0900

    correct scm urls
$ git merge upstream/master
...
$ git push
...
$ git log -1
commit 45f7de95a22a42167099c53849042cb1f88c8963
Author: Yusuke Yamamoto <yusuke@mac.com>
Date:   Tue Jun 9 23:41:45 2015 +0900

    correct scm urls
```


# 私家版を作ってプルリクを送るまで

## IDEAのプロジェクトを作る

Mavenからインポートする感じでプロジェクトを作る。
(Import Project からデフォルト設定で mvn からインポートすることでプロジェクトが作れる)

![](https://i.gyazo.com/76046302e0af0a128a87e098124dcb11.png)

![](https://i.gyazo.com/7374ae7bd690883ad2472d531e441f3e.png)

![](https://i.gyazo.com/28cd65ba486f0443a711680ef94dec5c.png)

![](https://i.gyazo.com/866e025b036960511787cd77f2df1e66.png)


## IDEAで修正する

修正したり機能追加したりテスト書いたり。。

## ビルド

package.sh を参考に mvn コマンドを実行する。

各モジュールディレクトリで下記を実行するとローカルの .m2/repo 以下に入る(twitter4j-4.0.4-SNAPSHOT ができる感じ)。

```bash
$ mvn clean install -Dmaven.test.skip=true
```

Goal を **install** にするのがポイント。


## 自分のアプリで利用する

"ローカルの.m2/repo" に配置された私家版Twitter4Jを自分のアプリで利用します。

```groovy:build.gradle
allprojects {
    repositories {
        // Twitter4J(local)
        mavenLocal()
    }
}
```

```groovy:app/build.gradle
dependencies {
    compile 'org.twitter4j:twitter4j-core:4.0.4-SNAPSHOT'
    compile 'org.twitter4j:twitter4j-media-support:4.0.4-SNAPSHOT'
    compile 'org.twitter4j:twitter4j-stream:4.0.4-SNAPSHOT'
...
}
```

## プルリク

テスト通って一通り動作確認できたらプルリクを送る。


# テストについて追記
イケメンさん曰く↓
<blockquote class="twitter-tweet" data-cards="hidden" lang="en"><p lang="ja" dir="ltr">テスト全部通すのはかなり難しいので、修正箇所で必要な部分だけコンシューマキーやシークレット用意すればok。ってかテスト通してなくてもプルリク当方で確認します！ - Twitter4J開発手順メモ(私家版の作り方) - Qiita - <a href="http://t.co/FzyiJNFKqx">http://t.co/FzyiJNFKqx</a></p>&mdash; いますぐフォローすべき山本裕介 (@yusuke) <a href="https://twitter.com/yusuke/status/612598138138800128">June 21, 2015</a></blockquote>
らしいです。
そういえば私も修正箇所周辺のテストしか通してませんでした。というか全部通そうとすると(一度やろうとしたことがある)テスト専用アカウントを複数用意してそれらのフォロー関係とかごにょごにょしなきゃいけないので余裕で半日くらいかかりますし現実的じゃないですね。

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">一回何も気にせず自分の垢をテストに使ったらアイコンがTwitter4jになりました <a href="https://t.co/sBYAhZfBRa">https://t.co/sBYAhZfBRa</a></p>&mdash; RED FAT だるま (@fat_daruuuuma) <a href="https://twitter.com/fat_daruuuuma/status/612605295504683008">June 21, 2015</a></blockquote>


# 他の人の修正を取り込む

他の人が行ったプルリクを自分のブランチにもマージしたい場合の手順をメモしておきます。

例えば、
![](https://i.gyazo.com/3add34eb112f7a3ef636ce8c1f952215.png)
[Add property for "tweet_volume" to Trend, YouTrack Issue #TFJ-886 by Bunkerbewohner · Pull Request #232 · yusuke/twitter4j](https://github.com/yusuke/twitter4j/pull/232)
のプルリクをマージしたい場合は下記の手順でやるといいです。



## 該当ブランチを探す

上記スクリーンショットの from ... の部分から分かるように、プルリク元のブランチは
https://github.com/Bunkerbewohner/twitter4j/tree/TFJ-886
です。

## リモートブランチを追加する

```bash
$ git remote
mumei
origin
upstream

$ git remote add Bunkerbewohner git@github.com:Bunkerbewohner/twitter4j.git

$ git remote
Bunkerbewohner   <-- 追加された！
mumei
origin
upstream
```

```bash
$ git fetch Bunkerbewohner
remote: Counting objects: 36, done.
remote: Total 36 (delta 7), reused 7 (delta 7), pack-reused 29
Unpacking objects: 100% (36/36), done.
From github.com:Bunkerbewohner/twitter4j
 * [new branch]      2.0.x      -> Bunkerbewohner/2.0.x
 * [new branch]      2.1.x      -> Bunkerbewohner/2.1.x
 * [new branch]      2.2.x      -> Bunkerbewohner/2.2.x
 * [new branch]      TFJ-671    -> Bunkerbewohner/TFJ-671
 * [new branch]      TFJ-679-api1.1 -> Bunkerbewohner/TFJ-679-api1.1
 * [new branch]      TFJ-886    -> Bunkerbewohner/TFJ-886
 * [new branch]      master     -> Bunkerbewohner/master
 * [new branch]      revert-171-TFJ-806 -> Bunkerbewohner/revert-171-TFJ-806
 * [new tag]         release-tfj-886 -> release-tfj-886
```



## マージする

マージ先をチェックアウトしてマージする

```bash
$ git checkout master

$ git merge Bunkerbewohner/TFJ-886
Merge made by the 'recursive' strategy.
 readme.txt                                         |  1 +
 .../java/twitter4j/TrendJSONImpl.java              | 13 ++++++-
 twitter4j-core/src/main/java/twitter4j/Trend.java  |  4 +++
 .../twitter4j/examples/trends/GetPlaceTrends.java  | 40 ++++++++++++++++++++++
 4 files changed, 57 insertions(+), 1 deletion(-)
 create mode 100644 twitter4j-examples/src/main/java/twitter4j/examples/trends/GetPlaceTrends.java
```

conflict があれば適宜修正しましょう。

以上です。